colorswatch: Render background properly
authorBenjamin Otte <otte@redhat.com>
Tue, 7 Oct 2014 21:24:51 +0000 (23:24 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 8 Oct 2014 03:20:30 +0000 (05:20 +0200)
We want to render a background *and* the current color (if there is
one).

This also adds a custom function gtk_render_add_content_path() which
adds the path of the current content area to a cairo_t.

gtk/gtkcolorswatch.c
gtk/gtkrender.c
gtk/gtkrenderprivate.h

index c50e364b393d2350e824670027f507de325d2846..d0feae389a156f6ec7c0c93e294aab3cee0a6931 100644 (file)
@@ -20,8 +20,6 @@
 #include "gtkcolorswatchprivate.h"
 
 #include "gtkcolorchooserprivate.h"
-#include "gtkroundedboxprivate.h"
-#include "gtkthemingbackgroundprivate.h"
 #include "gtkdnd.h"
 #include "gtkicontheme.h"
 #include "gtkmain.h"
@@ -30,6 +28,7 @@
 #include "gtkmenushell.h"
 #include "gtkprivate.h"
 #include "gtkintl.h"
+#include "gtkrenderprivate.h"
 #include "gtkwidgetprivate.h"
 #include "a11y/gtkcolorswatchaccessibleprivate.h"
 
@@ -107,7 +106,6 @@ swatch_draw (GtkWidget *widget,
              cairo_t   *cr)
 {
   GtkColorSwatch *swatch = (GtkColorSwatch*)widget;
-  GtkThemingBackground background;
   gdouble width, height;
   GtkStyleContext *context;
   GtkStateFlags state;
@@ -126,20 +124,19 @@ swatch_draw (GtkWidget *widget,
 
   gtk_style_context_save (context);
 
-  _gtk_theming_background_init (&background, context,
-                                0, 0, width, height,
-                                GTK_JUNCTION_NONE);
+  gtk_render_background (context, cr, 0, 0, width, height);
 
   if (swatch->priv->has_color)
     {
       cairo_pattern_t *pattern;
       cairo_matrix_t matrix;
 
+      gtk_render_content_path (context, cr, 0, 0, width, height);
+
       if (swatch->priv->use_alpha)
         {
           cairo_save (cr);
 
-          _gtk_rounded_box_path (&background.padding_box, cr);
           cairo_clip_preserve (cr);
 
           cairo_set_source_rgb (cr, 0.33, 0.33, 0.33);
@@ -155,18 +152,18 @@ swatch_draw (GtkWidget *widget,
 
           cairo_restore (cr);
 
-          background.bg_color = swatch->priv->color;
+          gdk_cairo_set_source_rgba (cr, &swatch->priv->color);
         }
       else
         {
-          background.bg_color = swatch->priv->color;
-          background.bg_color.alpha = 1.0;
+          cairo_set_source_rgb (cr,
+                                swatch->priv->color.red,
+                                swatch->priv->color.green,
+                                swatch->priv->color.blue);
         }
 
-      _gtk_theming_background_render (&background, cr);
+      cairo_fill (cr);
     }
-  else
-    _gtk_theming_background_render (&background, cr);
 
   gtk_render_frame (context, cr, 0, 0, width, height);
 
index 3f6bc17dbd74eafb5b27262fe12d0437ac7db60a..2f3f542209c364bc955f008aa59011bc484f75ac 100644 (file)
@@ -2446,3 +2446,47 @@ gtk_render_icon_surface (GtkStyleContext *context,
   cairo_restore (cr);
 }
 
+/*
+ * gtk_render_content_path:
+ * @context: style context to get style information from
+ * @cr: cairo context to add path to
+ * @x: x coordinate of CSS box
+ * @y: y coordinate of CSS box
+ * @width: width of CSS box
+ * @height: height of CSS box
+ *
+ * Adds the path of the content box to @cr for a given border box.
+ * This function respects rounded corners.
+ *
+ * This is useful if you are drawing content that is supposed to
+ * fill the whole content area, like the color buttons in
+ * #GtkColorChooserDialog.
+ **/
+void
+gtk_render_content_path (GtkStyleContext *context,
+                         cairo_t         *cr,
+                         double           x,
+                         double           y,
+                         double           width,
+                         double           height)
+{
+  GtkRoundedBox box;
+
+  g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
+  g_return_if_fail (cr != NULL);
+
+  _gtk_rounded_box_init_rect (&box, x, y, width, height);
+  _gtk_rounded_box_apply_border_radius_for_context (&box, context, 0);
+
+  _gtk_rounded_box_shrink (&box,
+                           _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_WIDTH), 100)
+                           + _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_PADDING_TOP), 100),
+                           _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH), 100)
+                           + _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_PADDING_RIGHT), 100),
+                           _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH), 100)
+                           + _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_PADDING_BOTTOM), 100),
+                           _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH), 100)
+                           + _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_PADDING_LEFT), 100));
+
+  _gtk_rounded_box_path (&box, cr);
+}
index 73a2c5349d7d1923a359e6064501850588fe5a0a..81c9d6ca63752d48fac2461602c21b5ae881b790 100644 (file)
 #include <pango/pango.h>
 #include <gdk/gdk.h>
 
+void        gtk_render_content_path  (GtkStyleContext   *context,
+                                      cairo_t           *cr,
+                                      double             x,
+                                      double             y,
+                                      double             width,
+                                      double             height);
 void        gtk_render_paint_spinner (cairo_t           *cr,
                                       gdouble            radius,
                                       gdouble            progress);